package com.zaimokuza.cn.service;

import com.zaimokuza.cn.entity.PageResult;
import com.zaimokuza.cn.entity.user.*;

import java.util.ArrayList;

/**
 * @author zaimokuza
 */
public interface UserService {

    /**
     * 注册用户
     *
     * @param registerUser 注册表单用户信息
     */
    void register(RegisterUser registerUser);

    /**
     * 记录登录操作
     *
     * @param userId 用户ID
     */
    void saveLoginRecord(String userId);

    /**
     * 更新用户
     *
     * @param detailedUser 用户
     */
    void updateUser(DetailedUser detailedUser);

    /**
     * 根据用户ID查询用户登录的信息
     *
     * @param userId 用户ID
     * @return 登录信息
     */
    LoginUser getUserLoginInfo(String userId);

    /**
     * 查询用户简要信息
     *
     * @param param  查询条件
     * @param userId 当前用户ID，用户关联关注信息
     * @return 用户简要信息
     */
    BriefUser getBriefUser(BriefUser param, String userId);

    /**
     * 根据用户ID查询用户详细信息
     *
     * @param id 用户ID
     * @return 用户详细信息
     */
    DetailedUser getDetailedUser(String id);

    /**
     * 查询推荐用户集合
     *
     * @param userId 当前用户ID，用户关联关注信息
     * @return 推荐用户集合
     */
    ArrayList<BriefUser> getRecommendUserList(String userId);

    /**
     * 根据搜索内容查询用户集合
     *
     * @param name   名称
     * @param userId 当前用户ID，用户关联关注信息
     * @param time   时间
     * @return 用户集合
     */
    ArrayList<BriefUser> getSearchUserList(String name, String userId, String time);

    /**
     * 根据用户域名查询粉丝用户集合
     *
     * @param domain 域名
     * @param userId 当前用户ID，用户关联关注信息
     * @param page   当前页
     * @param size   每页条数
     * @return 粉丝用户集合
     */
    PageResult<BriefUser> getFollowerPage(String domain, String userId, Integer page, Integer size);

    /**
     * 根据用户域名查询关注用户集合
     *
     * @param domain 域名
     * @param userId 当前用户ID，用户关联关注信息
     * @param page   当前页
     * @param size   每页条数
     * @return 关注用户集合
     */
    PageResult<BriefUser> getFollowingPage(String domain, String userId, Integer page, Integer size);

    /**
     * 查询联络人分页集合
     *
     * @param userId 当前用户ID，用户关联关注信息
     * @param page   当前页
     * @param size   每页条数
     * @return 联络人分页集合
     */
    PageResult<ContactUser> getContactUserPage(String userId, Integer page, Integer size);

    /**
     * 查询用户分页集合
     *
     * @param name   用户名称
     * @param userId 当前用户ID，用户关联关注信息
     * @param page   当前页
     * @param size   每页条数
     * @return 用户分页集合
     */
    PageResult<BriefUser> getBriefUserPage(String name, String userId, Integer page, Integer size);

    /**
     * 根据用户ID查询用户名称
     *
     * @param id 用户ID
     * @return 用户名称
     */
    String getUserNameById(String id);

    /**
     * 获取用户ID集合
     *
     * @return 用户ID集合
     */
    ArrayList<String> getUserIdList();

    /* 统计相关操作 */

    /**
     * 增加用户的博客数量
     *
     * @param userId 用户ID
     */
    void increaseBlogTotal(String userId);

    /**
     * 减少用户的博客数量
     *
     * @param userId 用户ID
     */
    void reduceBlogTotal(String userId);

    /**
     * 增加用户的粉丝数量
     *
     * @param userId 用户ID
     */
    void increaseFollowers(String userId);

    /**
     * 减少用户的粉丝数量
     *
     * @param userId 用户ID
     */
    void reduceFollowers(String userId);

    /**
     * 增加用户的关注数量
     *
     * @param userId 用户ID
     */
    void increaseFollowing(String userId);

    /**
     * 增加用户的关注数量
     *
     * @param userId 用户ID
     */
    void reduceFollowing(String userId);

}
